さあ、今回は背景に星を流します。大昔よく使われていた方法ですね。ギャラクシアンの背景みたいに、赤・黄・紫・青・黄緑・水色・白の原色をランダムに表示して星が流れているような雰囲気を作ります♪
まず4行目でスクリプトを見やすく・分かりやすくする為に、よく使う『HOSIMAX』と言うマクロを定義します。(あくまでも分かりやすくする為ですので、『HOSIMAX=100』の様に変数扱いとしても同様の結果になります)
次に『*SYOKIKA』の所に星の各種初期設定を追加します。その後、repeat〜loop間で乱数を利用して各種星の初期位置や初期移動速度・初期の色等を決定します。初期設定はココまでです。
次に『*MAIN』メインルーチンですが、ココにまたも1つサブルーチン『gosub
*HAIKEI』を追加します。このサブルーチンで星の移動処理を行います。また、今回はついでに土星のような惑星を背景にプラスして表示させます。この惑星はオリジナルでも1・2面次に出てきます。
さあ、『*HAIKEI』ここが今回のメインです・・・・って言っても相変わらず大した事はしてません・・・・(^^;
特に説明する事はないのですが、一応簡単に・・・
repeat〜loop間で星の数だけ移動処理を行います。各種星の座標と色と移動速度は、あらかじめ『*SYOKIKA』の所で乱数を使って決めていますので、星のY座標が640を超えた場合(画面外に出た場合)に乱数で新たにX座標を決めています。
惑星の移動については、ご覧の通りX座標は固定でY座標だけ一定の速度で移動させています。Y座標が1280を超えた場合(画面外に出てしばらく経ってから)には、Y座標をマイナスの値に代えて、ある程度時間が経つとまた現れるようにしています。
星の描画は、白一色で行ったり、星の大きさを変えたりする事で様々な画面効果を表すことが出来ます。もうチョット工夫すれば、雪のような物を表現するのも可能かもしれません。色々と試してみて下さい♪
尚、分かりにくい場所があれば、掲示板やメールにてご質問下さい
m(_ _)m
下記のスクリプトの一部または全部において転用は自由とさせていただきますので、色々と数字を換えてお試し下さい♪
下記スクリプトをHSPのスクリプトエディターにコピペでお使いいただけます。
|
#define SHOTMAX 2 ;自機弾最大数
#define ENEMYMAX 12 ;敵機最大数
#define TAMAMAX 36 ;敵弾最大数
#define HOSIMAX 100 ;流星最大数
buffer 3,,,1
picload "bomb1.bmp"
buffer 2,,,1
picload "cruiser.bmp"
screen 0,640,480,1,dispx-640/2,dispy-480/2:cls 4 : title "space cruiser"
font "MS 明朝",20
gmode 2
*SYOKIKA
mx=300 : my=400 ;自機の初期位置
lv=1 ;初期レベル
myl=1 ;自機生存の有無
uf=10 ;UFO生存の有無(UFOの硬さも表現しています)
ux=160 : uy=60 ;UFOの初期位置
usx=6 ;UFOの移動初速度(X軸)
usy=8 ;UFOの移動初速度(Y軸)
us=1 ;UFOの加速量
utsx=30 ;UFO弾の移動初速度(X軸)
utsy=6 ;UFO弾の移動初速度(Y軸)
gcnt=1 ;ゲームカウンターの初期値
ml=3 ;初期の自機数
dim sf,SHOTMAX ;自弾の有無
dim sx,SHOTMAX ;自弾のX座標
dim sy,SHOTMAX ;自弾のY座標
dim ef,ENEMYMAX ;敵の硬さ
dim ex,ENEMYMAX ;敵のX座標
dim ey,ENEMYMAX ;敵のY座標
dim et,ENEMYMAX ;敵発生からのカウンター
dim esx,ENEMYMAX ;敵のX軸移動量
dim esy,ENEMYMAX ;敵のY軸移動量
dim tf,TAMAMAX ;敵弾の有無
dim tx,TAMAMAX ;敵弾のX座標
dim ty,TAMAMAX ;敵弾のY座標
dim tk,TAMAMAX ;敵弾の種類(垂直OR斜頚)
dim td,TAMAMAX ;敵弾の弾道(方向)
dim ts,TAMAMAX ;敵弾の移動速度
dim hx,HOSIMAX ;星のX軸座標
dim hy,HOSIMAX ;星のY軸座標
dim hc,HOSIMAX ;星の色
dim hcr,HOSIMAX ;星の色(赤)
dim hcg,HOSIMAX ;星の色(緑)
dim hcb,HOSIMAX ;星の色(青)
dim hs,HOSIMAX ;星の移動速度
repeat HOSIMAX
rnd hx.cnt,640
rnd hy.cnt,480
rnd hcr.cnt,2
rnd hcg.cnt,2
rnd hcb.cnt,2
rnd hs.cnt,5 : if hs.cnt=0 : hs.cnt=5
hcr.cnt=hcr.cnt*255
hcg.cnt=hcg.cnt*255
hcb.cnt=hcb.cnt*255
loop
*MAIN ;メインループ
palcolor 0 : boxf 0,0,640,480
gosub *HAIKEI
gosub *MESSAGE
if myl>0 : gosub *JIKI
gosub *TAMA
if enemy=0 : gosub *TEKI
gosub *TEKIMOVE
gosub *TAMAMOVE
gosub *UFO
gosub *UFOTAMA
redraw 1 : redraw 2 : await 30
gcnt+
if gres=0 : goto *MAIN
gwt+
if gwt<100 : goto *MAIN
myl=1 : gwt=0 : gres=0 : mx=300 : my=400 : sf=0 : ff=0
repeat TAMAMAX : tf.cnt=0 : loop
if ml<1 : goto *GAMEOVER
goto *MAIN
*JIKI ;自機の移動・ショットキーチェック
stick bt,5 : k- : if k<1 : if bt&16 : ff=1 : k=3
mxv=(bt&4!0):mxv-=(bt&1!0)
mx+=mxv*8
if mx<0 : mx=0
if mx>580 : mx=580
pos mx,my : gcopy 2,0,32,64,64
return
*TAMA ;自機弾の移動・表示
repeat SHOTMAX
if ff>0 : if sf.cnt=0 : ff- : sf.cnt=1 : sx.cnt=mx+16 : sy.cnt=my-20
if sf.cnt=0 : continue
sy.cnt-=12 : if sy.cnt<-32 : sf.cnt=0
pos sx.cnt,sy.cnt : gcopy 2,96,0,32,32
loop
return
*TEKI ;敵の出現
repeat ENEMYMAX
if cnt<12 {
if cnt<10 {
if cnt<8 {
if cnt<6 {
if cnt<4 {
if cnt<2 { ef.cnt=1 : ex.cnt=cnt*100+100 : ey.cnt=80
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32
}else{ ef.cnt=1 : ex.cnt=cnt-2*100+100 : ey.cnt=130
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-4*100+100 : ey.cnt=180
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-5*100+300 : ey.cnt=80
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-7*100+300 : ey.cnt=130
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-9*100+300 : ey.cnt=180
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}
esx.cnt=5 : esy.cnt=5 : et.cnt=0
enemy=1
loop
return
*TEKIMOVE ;敵の移動処理・当たり判定
repeat ENEMYMAX
if ef.cnt<1 : continue
et.cnt++
if cnt<6 {
ex.cnt-=esx.cnt : if et.cnt>20 : et.cnt=-20 : esx.cnt=-esx.cnt
ey.cnt+=esy.cnt : if (ey.cnt>200)|(ey.cnt<50) : esy.cnt=-esy.cnt
}else{
ex.cnt+=esx.cnt : if et.cnt>20 : et.cnt=-20 : esx.cnt=-esx.cnt
ey.cnt+=esy.cnt : if (ey.cnt>200)|(ey.cnt<50) : esy.cnt=-esy.cnt
}
ent=cnt
repeat SHOTMAX
if sf.cnt=0 : continue
dx=(ex.ent+16)-(sx.cnt+16) : if dx<0 : dx=-dx
dy=(ey.ent+16)-(sy.cnt+16) : if dy<0 : dy=-dy
if dx<10 : if dy<10 {
ef.ent- : sf.cnt- : pos ex.ent,ey.ent : palcolor 255 : mes "●"
}
loop
rnd tam,200 : if tam=0 {
repeat TAMAMAX
if tf.cnt>0 : continue
tf.cnt+ : tx.cnt=ex.ent : ty.cnt=ey.ent
rnd ts.cnt,5 : ts.cnt+=5
rnd tk.cnt,3 : if tk.cnt=0 : tk.cnt=1
dx=ex.ent-mx : if dx<0 : td.cnt=-3 : else : td.cnt=3
break
loop
}
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32
loop
return
*TAMAMOVE ;敵弾の移動&当たり判定
repeat TAMAMAX
if tf.cnt<1 : continue
if tk.cnt=1 : ty.cnt+=ts.cnt : else : ty.cnt+=ts.cnt : tx.cnt-=td.cnt
if ty.cnt>480 : tf.cnt-
ent=cnt
repeat SHOTMAX
if sf.cnt=0 : continue
dx=(tx.ent+16)-(sx.cnt+16) : if dx<0 : dx=-dx
dy=(ty.ent+16)-(sy.cnt+16) : if dy<0 : dy=-dy
if dx<5 : if dy<10 {
tf.ent- : sf.cnt- : pos sx.cnt,sy.cnt : palcolor 255 : mes "●"
}
loop
if myl<1 : continue
dx=(tx.cnt+16)-(mx+32) : if dx<0 : dx=-dx
dy=(ty.cnt+16)-(my+32) : if dy<0 : dy=-dy
if dx<20 : if dy<30 {
tf.cnt- : myl- : ml- : gres+ : mmf=20 : gosub *MESSAGEBORN
}
pos tx.cnt,ty.cnt : gcopy 2,128,0,32,32
loop
return
*UFO ;UFO移動&当たり判定
if uf<1 : return
ux+=usx : uy-=usy
if (usy<-10)|(usy>10) : us=-us
usy-=us
if (ux<160)|(ux>400) : usx=-usx
repeat SHOTMAX
if sf.cnt=0 : continue
dx=(ux+48)-(sx.cnt+16) : if dx<0 : dx=-dx
dy=(uy+16)-(sy.cnt+16) : if dy<0 : dy=-dy
if dx<20 : if dy<10 {
uf- : sf.cnt- : pos sx.cnt,sy.cnt : palcolor 255 : mes "●"
}
loop
pos ux,uy : gcopy 2,64,(ufn+1)*32,96,32
if gcnt\20<1 : ufn=ufn+1\2
if gcnt\300<1 : if myl>0 {
utf+ : utx=ux+48 : uty=uy+16 : if ux>300 : utsx=-utsx
}
return
*UFOTAMA ;UFOの弾移動&当たり判定
if utf<1 : return
utx+=utsx : uty+=utsy
if uty>300 { if utx<200 : utsx+=10
if utx>400 : utsx-=10
} else {
if utx<250 : utsx+=8
if utx>350 : utsx-=8
}
if uty>480 : utf- : utsx=30
dx=(utx+32)-(mx+32) : if dx<0 : dx=-dx
dy=(uty+32)-(my+32) : if dy<0 : dy=-dy
if dx<20 : if dy<30 {
utf- : myl- : utsx=30
ml- : gres+ : mmf=20 : gosub *MESSAGEBORN
}
pos utx,uty : gcopy 2,0,0,32,32
return
*MESSAGEBORN ;メッセージ発生処理(爆風発生処理)
px=mx : py=my
return
*MESSAGE ;画面メッセージ&爆風の表示
pos 0,457 : gzoom 32,32,2,0,32,64,96 : palcolor 255 : pos 30,458 : mes ml
if mmf>0 {
pos px,py : gcopy 3,mybomx*96,mybomy*96,96,96
mybomx=mybomx+1\8
if mybomx=7 : mybomy=1
mmf--
}
return
*GAMEOVER ;ゲームオーバー
end
*HAIKEI ;背景(星)描画
repeat HOSIMAX
color hcr.cnt,hcg.cnt,hcb.cnt
hy.cnt=hy.cnt+hs.cnt
if hy.cnt>480 : hy.cnt=0 : rnd hx.cnt,640
pset hx.cnt,hy.cnt
loop
if (lv=1)|(lv=2) {
wakux=400 : wakuy++
if wakuy>1280 : wakuy=-96
pos wakux,wakuy : gcopy 2,160,0,96,96
}
return
|
|
 ↑見辛いですがこんな感じで背景に星が流れます♪
ついでに土星のような惑星も追加してみました(^^);
|
上手く出来たら、次に行ってみましょう♪
NEXT ->>
|